package com.lilosoft.core.executor.structs;

import java.util.concurrent.ConcurrentHashMap;

public class OrderedQueuePool<K, V> {

	ConcurrentHashMap<K, TasksQueue<V>> map = new ConcurrentHashMap<K, TasksQueue<V>>();
	
	/**
	 * 官方推荐的API方法putIfAbsent
	 * @param key
	 * @return
	 */
	public TasksQueue<V> getTasksQueue(K key) {
		TasksQueue<V> queue;
	    while (true) {
	    	queue = map.get(key);
	        if (queue == null) {
	        	queue = new TasksQueue<V>();
	            if (map.putIfAbsent(key, queue) == null) {
	                break;
	            }
	        }
	        break;
	    }
	    return queue;
	}

//	/**
//	 * 获得任务队列
//	 * 存在问题：用synchronized锁，在put操作时并没有对整个Map加锁，所以一个线程正在put(k,v)的时候，另一个线程调用get(k)会得到null，这就会造成一个线程put的值会被另一个线程put的值所覆盖
//	 * @param key
//	 * @return
//	 */
//	public TasksQueue<V> getTasksQueue(K key) {
//		synchronized (map) {
//			TasksQueue<V> queue = map.get(key);
//
//			if (queue == null) {
//				queue = new TasksQueue<V>();
//				map.put(key, queue);
//			}
//
//			return queue;
//		}
//	}

	/**
	 * 获得全部任务队列
	 * 
	 * @param key
	 * @return
	 */
	public ConcurrentHashMap<K, TasksQueue<V>> getTasksQueues() {
		return map;
	}

	/**
	 * 移除任务队列
	 * 
	 * @param key
	 * @return
	 */
	public void removeTasksQueue(K key) {
		map.remove(key);
	}
}
